/*
 Copyright (c) 2024 Broin All rights reserved.
 Use of this source code is governed by a BSD-style
 license that can be found in the LICENSE file.
 */

#ifndef STRUCT__H
#define STRUCT__H

/* 用户空间会用到，是vmlinux的一些定义 */
#ifdef USER_PROC
typedef signed char __s8;
typedef unsigned char __u8;
typedef short int __s16;
typedef short unsigned int __u16;
typedef int __s32;
typedef unsigned int __u32;
typedef long long int __s64;
typedef long long unsigned int __u64;
typedef __s8 s8;
typedef __u8 u8;
typedef __s16 s16;
typedef __u16 u16;
typedef __s32 s32;
typedef __u32 u32;
typedef __s64 s64;
typedef __u64 u64;
#endif // ! USER_PROC

/* 工程工具必要的一些数据结构 */

/* hashmap */
#define MAX_LOAD_FACTOR 0.75
typedef struct
{
    char **keys;
    int *values; // 新增：用于存储值的数组
    bool *occupied;
    size_t capacity;
    size_t size;
} HashMap;

#ifndef HASHMAP
#define HASHMAP
#define ROLE_MAP HashMap
#endif //! HASHMAP

/* ebpf skel */

#ifndef POLICY_SKEL

#define POLICY_SKEL struct lsm_permission_bpf
// #define POLICY_SKEL struct dir_permission_bpf
#endif // !POLICY_SKEL

/***********************************************************/

/* 策略相关*/

#define BPF_MAX_POLICIES 1 << 24
#define BPF_MAX_SUBJECT 1 << 24

#define MAX_ROLE_SIZE 64
#define MAX_ROLE_NAME_LEN 32
#define MAX_COMM_LEN 32

/***********************************************************/

typedef struct role
{
    u32 id;
    char role_name[MAX_ROLE_NAME_LEN];
} __attribute__((__packed__)) role_t;

typedef enum SUBTYPE
{
    PROC = 0x000,
    USER = 0x001
} subtype_t;

/* 主体相关定义 */
typedef struct subject
{
    union
    {
        /* data */
        char comm[MAX_COMM_LEN];
        u32 uid;
    };
    subtype_t type;
} __attribute__((__packed__)) subject_t;

/******************************************************** */

/* 策略类型相关定义，与MAP一一映射 */

typedef enum
{
    POLICY_FILE = 0x00,
    POLICY_FS = 0x01,
    POLICY_NET = 0x02
} policy_type_t;

/* 策略决策相关的定义：最终决策结果 */

typedef enum
{
    LSM_NO_DECISION = 0x00,
    LSM_ALLOW = 0X01,
    LSM_DENY = 0X02
} policy_decision_t;

/* 文件在系统安全策略中的蒙板集合：创建、读、写、执行、删除 */

typedef enum file_permission
{
    FILE_MAY_LINK = 0x00000001,   // l
    FILE_MAY_READ = 0x00000002,   // r
    FILE_MAY_WRITE = 0x00000004,  // w
    FILE_MAY_EXEC = 0x00000008,   // x
    FILE_MAY_DELETE = 0x00000010, // d
    FILE_MAY_APPEND = 0x00000011  // a
} file_permission_t;

typedef struct fs_policy_key
{
    u32 role_id; // 执行者是什么角色
    u32 fs_dev;  // 执行客体是哪个设备
} __attribute__((__packed__)) fs_policy_key_t;

typedef struct file_policy_key
{
    u32 role_id;  // 执行者是什么角色
    u64 inode_id; // 执行客体是哪个文件
} __attribute__((__packed__)) file_policy_key_t;

typedef struct file_policy_val
{
    file_permission_t allow;
    file_permission_t deny;
} __attribute__((__packed__)) file_policy_val_t;

/* 网络策略蒙板集合：创建、握手、监听、删除*/
typedef enum net_opt
{
    NETWORK_MAY_SOCKET_LISTEN = 0x00000200,  // L
    NETWORK_MAY_SOCKET_CONNECT = 0x00000400, // C
    NETWORK_MAY_SOCKET_CREATE = 0x00000800,  // R
    NETWORK_MAY_SOCKET_ACCEPT = 0x00001000,  // A
} net_opt_t;

/* 网络map */
typedef struct net_policy_key
{
    u32 role_id; // 执行者的角色
    u32 ip;      // 执行客体设置为ip
    // u32 port;
} __attribute__((__packed__)) net_policy_key_t;

typedef struct net_policy_val
{
    net_opt_t allow;
    net_opt_t deny;
} __attribute__((__packed__)) net_policy_val_t;

/******************************************************** */

/* 用户态：策略文件转义相关 */

struct pathList
{
    char **list;
    int count;
} __attribute__((__packed__));

/******************************************************/

/* 审计相关*/

typedef enum
{
    AUDIT_TYPE_FILE,
    AUDIT_TYPE_NET
} audit_type_t;

typedef enum
{
    AUDIT_LEVEL_NONE,
    AUDIT_LEVEL_DEBUG,
    AUDIT_LEVEL_LOG
} audit_level_t;

typedef struct audit_file
{
    u64 st_ino;
    u32 st_dev;
    file_permission_t access;
} __attribute__((__packed__)) audit_file_t;

typedef struct
{
    u32 uid;
    u32 ip;
    net_opt_t opt;
} __attribute__((__packed__)) audit_net_t;

typedef struct audit_event
{

    /* 主体相关信息 */
    char comm[MAX_COMM_LEN];
    u32 pid;
    u32 tgid;
    audit_type_t type;

    /* 操作信息 */
    u32 policy_id;

    /* 客体信息 */
    union
    {
        audit_file_t file_audit;
        audit_net_t net_audit;
    };

    /* 访问结果信息 */
    policy_decision_t decision;

} __attribute__((__packed__)) audit_event_t;

/********************************************/

/* 配置相关 */
typedef struct
{
    char policy_path[192];
    audit_level_t log_level;
    char log_path[192];
} config_t;

typedef struct mv_old_inode
{
    // u64 old_inode;
    // u64 new_inode;
    u32 pid;
    u64 inode_id;
    char new_path[64];
} __attribute__((__packed__)) mv_old_inode_t;

/******************************************************** */

typedef struct policy_container_val
{
    char path[256];
    file_permission_t allow;
    file_permission_t deny;
} __attribute__((__packed__)) policy_container_val_t;

typedef struct container_event
{
    u32 pid;
    // u32 mntns;
} __attribute__((__packed__)) container_event_t;
#endif // !STRUCT__H